﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using l1cs.server.serverpackets;
using l1cs.server.model;

namespace l1cs.server.clientpackets
{
    public class C_Title : ClientBasePacket
    {
        private const String _C_TITLE = "[C] C_Title";
        private static Logger _log = Logger.getLogger( typeof( C_Title ).FullName );

        public C_Title( byte[] abyte0, ClientThread clientthread )
            : base( abyte0 )
        {
            L1PcInstance pc = clientthread.getActiveChar();
            String charName = readS();
            String title = readS();

            if ( charName.Length == 0 || title.Length == 0 )
            {
                // \f1次のように入力してください：「/title \f0キャラクター名 呼称\f1」
                pc.sendPackets( new S_ServerMessage( 196 ) );
                return;
            }
            L1PcInstance target = L1World.getInstance().getPlayer( charName );
            if ( target == null )
            {
                return;
            }

            if ( pc.isGm() )
            {
                changeTitle( target, title );
                return;
            }

            if ( isClanLeader( pc ) )
            { // 血盟主
                if ( pc.getId() == target.getId() )
                { // 自分
                    if ( pc.getLevel() < 10 )
                    {
                        // \f1血盟員の場合、呼称を持つにはレベル10以上でなければなりません。
                        pc.sendPackets( new S_ServerMessage( 197 ) );
                        return;
                    }
                    changeTitle( pc, title );
                }
                else
                { // 他人
                    if ( pc.getClanid() != target.getClanid() )
                    {
                        // \f1血盟員でなければ他人に呼称を与えることはできません。
                        pc.sendPackets( new S_ServerMessage( 199 ) );
                        return;
                    }
                    if ( target.getLevel() < 10 )
                    {
                        // \f1%0のレベルが10未満なので呼称を与えることはできません。
                        pc.sendPackets( new S_ServerMessage( 202, charName ) );
                        return;
                    }
                    changeTitle( target, title );
                    L1Clan clan = L1World.getInstance().getClan( pc.getClanname() );
                    if ( clan != null )
                    {
                        foreach ( L1PcInstance clanPc in clan.getOnlineClanMember() )
                        {
                            // \f1%0が%1に「%2」という呼称を与えました。
                            clanPc.sendPackets( new S_ServerMessage( 203, pc.getName(), charName, title ) );
                        }
                    }
                }
            }
            else
            {
                if ( pc.getId() == target.getId() )
                { // 自分
                    if ( pc.getClanid() != 0 && !Config.CHANGE_TITLE_BY_ONESELF )
                    {
                        // \f1血盟員に呼称を与えられるのはプリンスとプリンセスだけです。
                        pc.sendPackets( new S_ServerMessage( 198 ) );
                        return;
                    }
                    if ( target.getLevel() < 40 )
                    {
                        // \f1血盟員ではないのに呼称を持つには、レベル40以上でなければなりません。
                        pc.sendPackets( new S_ServerMessage( 200 ) );
                        return;
                    }
                    changeTitle( pc, title );
                }
                else
                { // 他人
                    if ( pc.isCrown() )
                    { // 連合に所属した君主
                        if ( pc.getClanid() == target.getClanid() )
                        {
                            // \f1%0はあなたの血盟ではありません。
                            pc.sendPackets( new S_ServerMessage( 201, pc
                                    .getClanname() ) );
                            return;
                        }
                    }
                }
            }
        }

        private void changeTitle( L1PcInstance pc, String title )
        {
            int objectId = pc.getId();
            pc.setTitle( title );
            pc.sendPackets( new S_CharTitle( objectId, title ) );
            pc.broadcastPacket( new S_CharTitle( objectId, title ) );
            pc.save(); // DBにキャラクター情報を書き迂む
        }

        private bool isClanLeader( L1PcInstance pc )
        {
            bool isClanLeader = false;
            if ( pc.getClanid() != 0 )
            { // クラン所属
                L1Clan clan = L1World.getInstance().getClan( pc.getClanname() );
                if ( clan != null )
                {
                    if ( pc.isCrown() && pc.getId() == clan.getLeaderId() )
                    { // 君主、かつ、血盟主
                        isClanLeader = true;
                    }
                }
            }
            return isClanLeader;
        }

        override
        public String getType()
        {
            return _C_TITLE;
        }
    }
}